"""
li=[12,56,12,66]

li1=li

print(li)
print(id(li))

print(li1)
print(id(li1))

li[0]=120
print(li)
print(li1)

'''
[12, 56, 12, 66]
66886152
[12, 56, 12, 66]
66886152
[120, 56, 12, 66]
[120, 56, 12, 66]
'''

#所以我们在这里通过赋值的方式的话我们是不能对可变类型进行备份的
#因为赋值出的对象与原先的对象都指向的是同一块空间

#那么我们只能通过copy()进行备份的操作的


li2=li.copy()
li[2]=120
print(li)#[120, 56, 120, 66]
print(li2)#[120, 56, 12, 66]
#可见我们通过copy()备份的对象并没有因为原先对象的改变而改变

#这个就达到了我们备份的效果了
"""


"""
用户登录
如果用户名存在就输入密码，当密码正确的时候就显示登录成功并且退出程序
如果用户名不存在则提示用户注册

判断用户是否存在
    存在---输入密码
    不存在---提示用户注册
"""

"""
students =[
{'name':'张三','password':123},
{'name':'王五','password':888},
{'name':'赵六','password':456}
]


###成员运算符in(包含，存在)not in(不包含)
##if name in students:
##    print("存在")
##else:
##    print("不存在")

name=input("请输入用户名：")
for i in students:
    #i存在的是用户的信息字典
    if name==i['name']:
        #对输入的用户名进行判断
        for n in range(1,4):
            #循环3次进行输入密码的操作，如果输入正确直接跳出循环
            pwd=eval(input("请输入密码："))
            if pwd==i['password']:
                print('登录成功')
                exit()
                #break#只能退出当前所在的循环，就是跳出了里面的循环，还是处于外部循环
            else:
                print(f'密码错误,还剩{3-n}次机会')
    #if name==i['name'] and pwd==i['password'] :
        break
else:#循环正常结束执行，即没有break语句
    print("用户名不存在")

#对于这个程序的话，我们 不管输入什么最后都会打印这个用户名不存在
#我们内循环里面的break仅仅只够我们跳出内部循环
#但是没有跳出外部循环，这就是为什么会打印else的那句话
#那么我们就在外部循环加上一个判断语句，如果条件成立就直接跳出
#那么就不会进行这个循环后面的代码了

#总结，就是break只能退出当前所在的循环，所以在外边循环中我们需要再写一个break跳出外部循环

#对于后面的这个else语句来说
#循环正常结束执行，即没有break语句


#但是我们在内循环break的位置加一个exit()
#我们直接退出这个程序，那么就没有后面else的事了

#如果后面有代码的话，这个exit()影响到了后面代码的执行的话
#那么我们就使用break来跳出
#两个break


students =[
{'name':'张三','password':123},
{'name':'王五','password':888},
{'name':'赵六','password':456}
]
name=input("请输入用户名：")
for i in students:
    #print(i)
    if name in i.values():
        #获取当前字典内的值
        #我们在这里需要用到字典相关的函数--values去获取字典内的值
        #查看当前遍历到的字典有没有我们输入的name
        #print("存在")
        for n in range(3):
            pws=int(input("请输入密码："))
            if pws==i['password']:
                print("登录成功")
                exit()
            else:
                print(f"密码错误,还剩{3-n}次机会")
        
    
else:#循环正常结束才会执行
    print("用户名不存在")
#在这个代码里面只有一个循环
#那么我们在break之后我们就不会触发这个else了，我们直接跳出循环了
#我们这里的break跳出循环是非正常循环的
"""


'''
数字重复统计：
(1)随机生成1000个整数  
import.random
random.randint
(2)数字的范围[20,100]
(3)升序输出所有不同的数字及每个数字重复的次数
'''
import random
li=[]#创建一个空列表
for i in range(1000):
    num=random.randint(20,100)
    print(num)
    li.append(num)#我们将每次循环产生的数添加到这个列表中

print(li)

#升序输出所有不同的数字---去重(转换为集合)，排序(sort)
li1=list(set(li))
#先转换为集合再转换为列表，我们就达到了去重的效果
print(li1)
li1.sort()#默认是从小到大，升序的
print(li1)

#每个数字重复的次数---统计数字出现的次数(序列.count(数据))
for i in li1:#遍历去重的列表
    #进行统计，对没有机芯工去重的列表进行统计
    x=li.count(i)
    print(f'{i}出现了{x}次')
    
#我们所有的数字已经在li1里面了，而且没有重复的
#那么我们将这个列表作为外循环的条件进行遍历
#然后我们在li这个链表即兴每次遍历的数字的出现次数的计算


#我们需要将元素存储起来
#那么存放多个元素的有什么呢？
#列表、元组（不可修改）、字典（键值对）、集合
#那么最后只有列表和集合方便
#这个题的要求是还要统计重复数字的次数而且保存重复的数字
#那么我们直接将字典排除了
#因为字典是去重的
#那么最后我们就使用列表来对这些数字进行存储


'''
猜拳(石头、剪刀、布)
电脑出拳---random.choice(序列)---从序列中的元素随机挑一个
用户出拳---input()

用户赢（需要下面的两种情况都能实现，那么我们就需要使用and）
    用户出布   电脑出石头  
    用户出石头   电脑出剪刀
    用户出布    电脑出石头
对于这种三种情况我们只需要满足一个情况的，我们三个情况之间用or连接
平局
    电脑==用户

'''


while True:#死循环，只有我们输入‘退出’我们就会退出这个循环了
    import random
    li=['石头','剪刀','布']
    cp=random.choice(li)#从这个列表中随机选择一个
    print(cp)
#那么电脑随机出拳我们就实现成功了

#接下来我们就开始实现用户出拳了
    user=input("*****请出拳(石头、剪刀、布、退出******):")
#我们需要对用户输入的进行判断，看看用户输入的是不是正确的
#方式一：if user=='剪刀'or'石头'or'布':
#方式二，我们使用成员运算符，看看用户输入的是不是成员
    if user in li:
    #用户赢
        if user=='布'and cp=='石头'or user=='剪刀'and cp=='布'or user=='石头' and cp=='剪刀':
            print("你赢了")
            break
        elif user==cp:
            print("平局")
        else:
            print("你输了")
    elif user=="退出":
        print("退出猜拳游戏")
        break
    else:
        print("请正确出拳（石头、剪刀、布、退出）")
































































































































































